home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / cliOpNames.c < prev    next >
C/C++ Source or Header  |  1990-08-16  |  4KB  |  175 lines

  1. /*
  2.  * @(#)cliOpNames.c    1.5  10/24/89
  3.  */
  4. #include "assert.h"
  5. #include "types.h"
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <sys/uio.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <stdio.h>
  12.  
  13. extern int errno;
  14.  
  15. #include <netdb.h>
  16. #include <signal.h>
  17. #define SOCKETNUMBER 2019
  18.  
  19. #include "opNames.h"
  20.  
  21. extern char *emDirectory;
  22.  
  23. int serverSocket;
  24.  
  25. static void send(socket, string)
  26. int socket;
  27. char *string;
  28. {
  29.   int length = strlen(string) + 1;
  30.   if (write(socket, string, length) != length) {
  31.     fprintf(stderr, "Write failed on socket %d\n", socket);
  32.     fprintf(stderr, "String was \"%s\"\n", string);
  33.     abort();
  34.   }
  35. }
  36.  
  37. static void receive(socket, string)
  38. int socket;
  39. char *string;
  40. {
  41.   int length;
  42.   length = read(socket, string, 4096);
  43.   if (length < 0) {
  44.     perror("receive: (read)");
  45.     abort();
  46.   } else if (length == 0) {
  47.     *string = '\0';
  48.   }
  49. }
  50.  
  51. char *opNameServerArgs[] = {
  52.   "OpNameServer",
  53.   (char *) 0
  54. };
  55. extern int callsys();
  56.  
  57. int establishConnection()
  58. {
  59.   struct sockaddr_in   serverAddress;
  60.  
  61. #define USEHOSTLOOKUP
  62. #ifdef USEHOSTLOOKUP
  63.   char             *myHostName = EMSERVERHOST;
  64.   struct hostent   *myHost;
  65.   int machineNameGiven = 1;
  66. #endif
  67.   char binname[100];
  68.   int success = 1, try = 0;
  69.   
  70. again:
  71.   if (++try > 2) {
  72.     success = 0;
  73.     goto cleanup;
  74.   } 
  75.   serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  76.   if (serverSocket < 0) {
  77.     perror("establishConnection: (socket)");
  78.     success = 0;
  79.     goto cleanup;
  80.   }
  81.  
  82. #ifdef USEHOSTLOOKUP
  83.   if (! machineNameGiven) {
  84. #define SIZEOFMYHOSTNAME 100
  85.     if (gethostname(myHostName, SIZEOFMYHOSTNAME) < 0) {
  86.       perror("establishConnection: (gethostname)");
  87.       success = 0;
  88.       goto cleanup;
  89.     }
  90.   }
  91.   myHost = gethostbyname(myHostName);
  92.   if (myHost == NULL) {
  93.     perror("establishConnection: (gethostbyname)");
  94.     success = 0;
  95.     goto cleanup;
  96.   }
  97.  
  98.   bzero((char *)&serverAddress, sizeof(serverAddress));
  99.   bcopy((char *)myHost->h_addr, (char *)&serverAddress.sin_addr,
  100.     myHost->h_length);
  101. #else
  102.   serverAddress.sin_addr.s_addr = 0x36015f80;
  103. #endif
  104.   
  105.   serverAddress.sin_family = AF_INET;
  106.   serverAddress.sin_port = ntohs(SOCKETNUMBER);
  107.  
  108.   if (connect(serverSocket, (struct sockaddr *)&serverAddress,
  109.     sizeof(serverAddress)) == -1) {
  110.     perror("establishConnection: (connect)");
  111.     fprintf(stderr, "Trying to re-start server\n");
  112.     sprintf(binname, "%s/bin/startOpNameServer", emDirectory);
  113.     callsys(binname, opNameServerArgs, (char *)NULL,
  114.       (char *)NULL);
  115.     fprintf(stderr, "Started server, trying again.\n");
  116.     if (close(serverSocket) < 0) perror("close");
  117.     goto again;
  118.   }
  119.  
  120. #ifdef DEBUG
  121.   fprintf(stdout, "Connected to %d\n", ntohs(serverAddress.sin_port));
  122. #endif
  123.  
  124. cleanup:
  125.   return(success);
  126. }
  127.  
  128. void ON_initialize()
  129. {
  130.   if (establishConnection() != 1) assert(0);
  131. }
  132.  
  133. void ON_finalize()
  134. {
  135.   if (close(serverSocket) != 0) assert(0);
  136. }
  137.  
  138. static OID nextOID = 0, maxOID = 0;
  139. char buffer[128];
  140.  
  141. OID AllocateOID()
  142. {
  143.   if (nextOID == 0 || nextOID > maxOID) {
  144.     sprintf(buffer, "A \n");
  145.     send(serverSocket, buffer);
  146.     receive(serverSocket, buffer);
  147.     if (sscanf(buffer, "A 0x%x\n", &nextOID) != 1) assert(FALSE);
  148.     maxOID = nextOID + OIDBLOCKSIZE - 1;
  149.   }
  150.   return(nextOID++);
  151. }
  152.  
  153. OID ON_Translate(s)
  154. char *s;
  155. {
  156.   OID result;
  157.   sprintf(buffer, "T %s\n", s);
  158.   send(serverSocket, buffer);
  159.   receive(serverSocket, buffer);
  160.   if (sscanf(buffer, "T 0x%x\n", &result) != 1) assert(FALSE);
  161.   return(result);
  162. }
  163.  
  164. char result[128];
  165. char *ON_Name(id)
  166. OID id;
  167. {
  168.   sprintf(buffer, "N 0x%08x\n", id);
  169.   send(serverSocket, buffer);
  170.   receive(serverSocket, buffer);
  171.   /* this one returns null since the answer can be "N \n" */
  172.   if (sscanf(buffer, "N %s\n", result) != 1) return(NULL);
  173.   return(result);
  174. }
  175.